package main

import "fmt"

//而面向对象的可复用设计的第一块基石，便是所谓的”开-闭“原则（Open-Closed Principle,常缩写为OCP）。
//虽然，go不是面向对象语言，但是也可以模拟实现这个原则。对扩展是开放的，对修改是关闭的。

// 定义一个宠物接口
type Pet interface {
	eat()
	sleep()
}

// 定义一个结构体，狗
type DOg struct {
	name string
}

// 猫
type CAt struct {
	name string
}

// 人
type REn struct {
	name string
}

// 定义方法,狗
func (dog DOg) eat() {
	fmt.Println(dog.name, "吃")
}
func (dog DOg) sleep() {
	fmt.Println(dog.name, "睡")
}

// 猫
func (cat CAt) eat() {
	fmt.Println(cat.name, "吃")
}
func (cat CAt) sleep() {
	fmt.Println(cat.name, "睡")
}

// 人，添加一个养宠物的方法
func (ren REn) care(pet Pet) {
	pet.eat()
	pet.sleep()
}

func main() {
	dog := DOg{name: "德牧"}
	cat := CAt{name: "狸猫"}
	ren := REn{name: "打盹"}
	ren.care(dog)
	ren.care(cat)
}
